package com.kotlin

import kotlin.random.Random

class IfTest {
    /**
     * 1、测试if 表达式
     * 2、当 if 作为表达式时，必须要有 else
     * 3、if 的分支可以是代码块，最后的表达式作为该块的值
     */
    fun ifExpress(num1: Int, num2: Int): Int {
        var max = if (num1 > num2) num1 else {
            println("if的分支可以是代码块，最后的表达式作为该块的值")
            num2
        }
        println("$num1,$num2 ==> the max num is $max")
        return max
    }

    /**
     * 测试if else if
     */
    fun ifElseIf(num1: Int) {
        if (num1 in 6..9) {
            println("the num's value is $num1 in 6..9")
        } else if (num1 in 10..20) {
            println("the num's value is $num1 in 10..20")
        } else {
            println("the num's value is $num1 and this value > 20")
        }
    }
}

class WhenTest {
    /**
     * 测试when表达式,只会进入第一个满足条件的分支
     */
    fun whenCondition(condition: Any) {
        // 判断条件
        when (condition) {
            1 -> println("the condition's value is $condition")
            2, 3 -> println("在多个常量中可以这样写")
            in 4..10 -> println("在区间中可以这样写")
            // !in 4..10 -> println("不在区间中可以这样写")
            is String -> println("the $condition is String,and the length is ${condition.length}")
            isTrue(condition) -> println("条件可以调用另外一个方法进行判断")
            else -> {
                println("else或上方的lambda表达式中也可以写多个语句，如果是表达式，那么最后的一个语句作为表达式的值")
            }
        }

        when {
            condition is Boolean -> {
                println("传递进行的 condition 是一个布尔类型的值，结果为：$condition")
            }
            condition is Int && condition > 50 -> println("the condition's value is Int and the value ($condition) > 50")
            else -> {
                println("when 也可以用来取代 if-else if链。 如果不提供参数，所有的分支条件都是简单的布尔表达式，而当一个分支的条件为真时则执行该分支")
            }
        }

        // 接收 when 表达式返回的值 (当 when 作为表达式使用的时候必须要有 else 分支 除非编译器能够检测出所有的可能情况都已经覆盖了［例如，对于 枚举（enum）类条目与密封（sealed）类子类型］)
        var result = when (condition) {
            1 -> 1
            else -> {
                println("将 when 表达式的值赋值给一个变量，当存在多个语句时，最后一个语句作为表达式的值")
                10
            }
        }

        println("the when express's return value is $result")
    }

    /**
     * 判断是否是True
     */
    private fun isTrue(condition: Any): Boolean {
        return condition is Boolean && condition
    }
}

class ForTest {

    /**
     * 测试for循环
     */
    fun forLoop() {
        var array = arrayOf(10, 20, 30, 40, 50, "aa", "bb")

        // 遍历方式一
        for (any in array) {
            println(any)
        }

        // 遍历方式二
        array.forEachIndexed { index, any -> println("the index is $index and the value is $any") }

        // 遍历方式三
        for (i in array.indices) {
            println("the index is $i and the value is ${array[i]}")
        }

        // 遍历方式四
        for ((index, value) in array.withIndex()) {
            println("the index is $index and the value is $value")
        }

        // 遍历方式五
        var iterator = array.iterator()
        while (iterator.hasNext()) {
            println("使用迭代器遍历：" + iterator.next())
        }

        // 遍历方式六
        array.iterator().forEachRemaining { item -> println(item) }
        array.iterator().forEach { item -> println(item) }
    }
}

class WhileTest {
    /**
     * 测试while
     */
    fun whileTest() {
        var random = (0..100).random()
        while (random > 0) {
            println("the current random value is $random")
            Thread.sleep(100)
            if (random in (10..50))
                break
            random = (0..100).random()
        }
    }
}

/**
 * 测试返回和跳转
 * 标签处返回略
 */
class BreakContinueReturnTest {

    fun skip() {
        for (i in (1..10)) {
            if (i == 2) {
                continue
            }
            if (i == 5) {
                break
            }
            println("skip continue/break print $i")
        }
        for (i in (1..10)) {
            if (i == 1) {
                return
            }
            println("skip return print $i")
        }
    }
}


fun main(args: Array<String>) {
    // 测试 if 表达式
    IfTest().ifExpress(3, 5)
    // 测试 if else if
    IfTest().ifElseIf(10)
    // 测试 when
    WhenTest().whenCondition(2)
    // 测试 for
    ForTest().forLoop()
    // 测试 while 循环
    WhileTest().whileTest()
    // 测试循环过程中的 跳出循环
    BreakContinueReturnTest().skip()
}